Let work xstrndup and xstrndupt with non-terminated strings.
authoroliskoli <oliskoli@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sun, 26 Mar 2006 21:58:12 +0000 (21:58 +0000)
committeroliskoli <oliskoli@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sun, 26 Mar 2006 21:58:12 +0000 (21:58 +0000)
gpsbabel/util.c

index 82d61a2660dd92418004427c8e431b788f5b7091..9d90b10667c8c89e0d17e091f2997f20c98d8bb0 100644 (file)
@@ -144,14 +144,15 @@ XSTRNDUP(const char *str, size_t sz, DEBUG_PARAMS )
 xstrndup(const char *str, size_t sz)
 #endif
 {
-       size_t newlen;
+       size_t newlen = 0;
+       char *cin = (char *)str;
        char *newstr;
 
-       newlen = strlen(str);
-       if (newlen > sz) {
-               newlen = sz;
+       while ((newlen < sz) && (*cin != '\0')) {
+               newlen++;
+               cin++;
        }
-
+       
        newstr = (char *) xmalloc(newlen + 1);
        memcpy(newstr, str, newlen);    
        newstr[newlen] = 0;
@@ -170,17 +171,18 @@ XSTRNDUPT(const char *str, size_t sz, DEBUG_PARAMS )
 xstrndupt(const char *str, size_t sz)
 #endif
 {
-       size_t newlen;
+       size_t newlen = 0;
+       char *cin = (char *)str;
        char *newstr;
 
-       newlen = strlen(str);
-       if (newlen > sz) {
-               newlen = sz;
+       while ((newlen < sz) && (*cin != '\0')) {
+               newlen++;
+               cin++;
        }
-
+       
        newstr = (char *) xmalloc(newlen + 1);
-       memcpy(newstr, str, newlen);
-       newstr[newlen] = '\0';
+       memcpy(newstr, str, newlen);    
+       newstr[newlen] = 0;
        rtrim(newstr);
 
        return newstr;